<html>
<head>
<title>nTube: Changelog</title>
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<style type="text/css" id="__ntheming_global">
html {
	background-color: black;
	color: white;
}
</style>
<style type="text/css" id="__ntheming_global_font">
html {
	font-family: sans-serif;
	font-size: medium;
}
</style>
<style type="text/css">
.changelog_entry {
		line-height: 80%;	
}
</style>
<script type="text/javascript" >
	function getCookie(name) {
    var nameEQ = name + "=";
    var ca = document.cookie.split(';');
    for(var i=0;i < ca.length;i++) {
        var c = ca[i];
        while (c.charAt(0)==' ') c = c.substring(1,c.length);
        if (c.indexOf(nameEQ) == 0) return c.substring(nameEQ.length,c.length);
    }
    return null;
	}
	
	function canStoreData() {
		return typeof Storage == "function" || navigator.cookieEnabled;
	}

	function readSettings() {
		if (!canStoreData()) {
			return null;	
		}
		if (localStorage.getItem("_ntube_settings") != null) {
			return localStorage.getItem("_ntube_settings");
		}else {
			return getCookie("settings");
		}	
}

	function readSettingsToJSON() {
		var rs = readSettings();
		if (rs == null) {
			return null;	
		}
		return JSON.parse(b64DecodeUnicode(rs));
	}
	
	function applyTheme(themeCode) {
		console.log("[nTube: nTheming] Loading CSS for this page...");
		send_request("/api/get_css?eurl=" + themeCode, "", function () {
			console.error("[nTube: nTheming] Failed to load CSS!");
		}, function (data) {
			document.getElementById("__ntheming_global").innerHTML = data;
		});
	}

	function applyFont(fontCode) {
		console.log("[nTube: nTheming] Loading font for this page...");
		send_request("/api/get_font?eurl=" + fontCode, "", function () {
			console.error("[nTube: nTheming] Failed to load font!");
		}, function (data) {
			document.getElementById("__ntheming_global_font").innerHTML = data;
		});
	}
	
	function b64DecodeUnicode(str) {
    try {
 		return decodeURIComponent(Array.prototype.map.call(atob(str), function(c) {
        	return '%' + ('00' + c.charCodeAt(0).toString(16)).slice(-2);
    	}).join(''));   	
    }catch (ex) {
    	return atob(str);	
    }
	}
	
	function send_request(url, data, onFail, onSuccess) {
	if (typeof fetch != "undefined") {
		fetch(url).then(function(response) {
    		return response.text();
   	}).then(function(json) {
   		onSuccess(json);
   	}).catch(function(ex) {
   		console.error(ex);
    		onFail();
  		});	
	}else {
		console.warn("send_request() -> Outdated browser found, attempting fallback method...");
		var http = new XMLHttpRequest();
		http.open('POST', url, true);
	   http.setRequestHeader('Content-type', 'application/x-www-form-urlencoded');
	   
	   var hasResponse = false;
	   //var res = "";
	   http.onreadystatechange = function() {
		if (http.readyState == 4 && http.status == 200) {
		//		res = http.responseText;
				onSuccess(http.responseText.split("\n")[4]);
			}
		}
		http.ontimeout = function() {
			alert("nTube: onTimeout() was called when fetching your video!");
		}
		http.send(params);
	}
	//var http = new XMLHttpRequest();
	//var params = data;
	//http.timeout = 0;
	//http.responseType = 'blob';
	//http.open('POST', url, true);
	//http.setRequestHeader('Content-type', 'application/x-www-form-urlencoded');
			
	//var hasResponse = false;
	//var res = "";
	//http.onreadystatechange = function() {
	//	if (http.readyState == 4 && http.status == 200) {
	//		res = http.responseText;
	//		onSuccess(http.responseText);
	//	}
	//}
	//http.ontimeout = function() {
	//	alert("nTube: onTimeout() was called when fetching your video!");
	//}
	//http.send(params);
	
	/*		
	var stop = false;
	var time = 0;
	while (!hasResponse) {
		if (stop) {
			break;
		}
		if (time > 1500) {
			//alert("Timeout occured, try again.");
			onFail();
			stop = true;
		}
		var ix = -1;
		time += 1;
	}*/
	}
</script>
</head>
<body>
<center>
	<h2 style="color: lightgreen;">
		<a href="/" style="text-decoration: none;color: inherit;">
			<span style="color: red;">n</span>Tube
		</a>
	</h2>
	<h3>Changelog</h3>
</center>
<div>
	<div>
		<center style="border-top: 1px solid green;">
			<h3>1.4.4</h3>
		</center>
		<p class="changelog_entry">This major release added some features and fixed alot of bugs.</p>
		<p class="changelog_entry">- This is the final version of nTube that uses the following libraries.</p>
		<ul>
			<li>nullUtil 2.x (used 2.7, replaced with 3.0.0 in nTube 1.5)</li>
			<li>HttpServer 2.x (used 2.1, replaced with 3.0 in nTube 1.5)</li>
			<li>YouTubeExtractor 1.x (used 1.0.4.x, replaced with 2.0 in nTube 1.5)</li>
		</ul>
		<p class="changelog_entry">- This is the final version of nTube 1.4.x.</p>
		<p class="changelog_entry">- This version contains all patches shown in the release candidates.</p>
		<center style="border-top: 1px solid green;">
			<h3>1.4.4-rc5</h3>
		</center>
		<p class="changelog_entry">- Subscriptions have been implemented! The only thing left to implement is notifications.</p>
		<p class="changelog_entry">- nPlayer: Updated nPlayer API to 1.1.1. (was 1.1.0)</p>
		<p class="changelog_entry">- nPlayer: Background Playback on Chromium/Chrome based browsers is now supported.</p>
		<p class="changelog_entry">- nPlayer: Fixed issue where the Player attempts to sync a single video.</p>
		<p class="changelog_entry">- Updated HttpServer to 2.1.</p>
		<p class="changelog_entry">- nTube now supports SSL! (Should be on port 8081 by default!)</p>
		<p class="changelog_entry">- Fast Mode<sup>2</sup>: Updated signature extraction methods.</p>
		<p class="changelog_entry">- Fast Mode<sup>2</sup>: Updated URL extraction methods.</p>
		<p class="changelog_entry">- The select tag now properly is displayed on Chrome/Chromium based browsers.</p>
		<p class="changelog_entry">- Improved mobile support, nPlayer for Mobile is a work in progress for now.</p>
		<p class="changelog_entry">- Channels: Blank videos now longer show up due to an error.</p>
		<p class="changelog_entry">- Channels: Subscriber count will now show up on most channels. (exceptions include VEVO channels)</p>
		<p class="changelog_entry">- Mobile Browsers will now use Fast Mode<sup>2</sup>.</p>
		<p class="changelog_entry">NOTE to mobile users (currently tested on iOS): You currently are unable to change video quality from the default one. (>720p30) </p>
		<center style="border-top: 1px solid green;">
			<h3>1.4.4-rc4</h3>
		</center>
		<p class="changelog_entry">- nPlayer: Updated nPlayer API to 1.1.0. (was 1.0.3)</p>
		<p class="changelog_entry">- Impelemented Data Saving features.</p>
		<p class="changelog_entry">- Added in-video quality switching. (&prefer now applys only to the default video that is loaded.)</p>
		<p class="changelog_entry">- Updated handling of the args <span style="font-family: monospace;">&onlyWebM, &openCodecsOnly, &allowWebM</span>.</p>
		<p class="changelog_entry">- The arguments <span style="font-family: monospace;">&no60, &audio</span> will NO LONGER disable Fast Mode based extraction.</p>
		<p class="changelog_entry" style="line-height: 100%;">- Updated Video API to version 1.5. <br> New Features: </p>
		<ul>
			<li>Neater API providing more video information.</li>
			<li>Faster data processing.</li>
			<li>Video quality and audio quality switching.</li>
		</ul>
		<p class="changelog_entry">- Video API: The JSON values <span style="font-family: monospace;">[videoURL, videoURL60, videoURL60A, use60FPS]</span> have been removed. </p>
		<center style="border-top: 1px solid green;">
			<h3>1.4.4-rc3</h3>
		</center>
		<p class="changelog_entry">- Updated Search API: Nice new features.</p>
		<ul>
			<li>Channel support.</li>
			<li>Playlists are now indicated.</li>
		</ul>
		<p class="changelog_entry">- Search API: Some videos should no longer report a duration of 0 seconds.</p>
		<p class="changelog_entry">- Fixed playback issue with videos have a source of 'yt_otf'.</p>
		<p class="changelog_entry">- Fixed playlists that repeat due to them having no previous index information.</p>
		<p class="changelog_entry">- The channel page now supports /user/ links.</p>
		<p class="changelog_entry">- Added in-video searching, nice.</p>
		<p class="changelog_entry">- Prepartion for Video API 1.5.</p>
		<p class="changelog_entry">- Removed legacy subtitle API.</p>
		<p class="changelog_entry">- Fixed CSS error with text colours in list selections. (affected select tag)</p>
		<p class="changelog_entry">- Reduced requests amount by 1.</p>
		<p class="changelog_entry">- nTV: Fixed Twitch.tv streaming.</p>
		<p class="changelog_entry">- nTV: Updated API.</p>
		<p class="changelog_entry">- nTV: Twitch.tv now auto refreshses streamer status. (updates every 3 minutes)</p>
		<p class="changelog_entry">- nTV: Updated UI.</p>
		<p class="changelog_entry">- nTV: Added Twitch.tv chat support and placeholders for other streaming services.</p>
		<p class="changelog_entry">- Proxy API: Switched time heavy function with lighter one. <span style="font-family: monospace;">[minus(1)-->i.set(i.get()-1)]</span></p>
		<p class="changelog_entry">- YouTube API: Signature decipherers are now cached to reduce request count. (Caches are refreshed every 30 minutes)</p>
		<p class="changelog_entry">- YouTube API: Added support for alternative signature method provided by YouTube. <span style="font-family: monospace;">?lsig=*sig*</span></p>
		<p class="changelog_entry">- YouTube streaming: Fixed issue with some streams failing to extract.</p>
		<p class="changelog_entry">- Fast Mode<sup>2</sup>: Fixed cases where the sources would lack URLs.</p>
		<p class="changelog_entry">- TO FIX: Chromium seems to disallow embedded twitch chat from accessing storage, breaks loading process.</p>
		<p class="changelog_entry">- TODO: Implement YouTube's hashtag search system.</p>
		<center style="border-top: 1px solid green;">
			<h3>1.4.4-rc2</h3>
		</center>
		<p class="changelog_entry">- Updated AV1 codec support.</p>
		<p class="changelog_entry">- Added YUV420p10 video colour support. (Currently can be enabled by passing argument &colorYUV420p10, known as yuv420p 10 bit colour mode)</p>
		<p class="changelog_entry">- Added 8K + 8K60 support.</p>
		<p class="changelog_entry">- Updated YouTube Extractor backend.</p>
		<p class="changelog_entry">- Updated HttpServer2 backend.</p>
		<p class="changelog_entry">- 'Fixed' CORS issues with YouTube livestreams.</p>
		<p class="changelog_entry">- Expanded the subtitle size. (large -> x-large, does NOT apply to embedded videos)</p>
		<p class="changelog_entry">- Added Proxy support to geographically blocked content. (Nice, it works...sometimes) </p>
		<p class="changelog_entry">- Fixed handling of live streaming and geographically censored content.</p>
		<p class="changelog_entry">- (USERSCRIPT PREP) Embed now requires a click to begin extracting, it's to prevent a MILLION requests being sent to YouTube at once.</p>
		<center style="border-top: 1px solid green;">
			<h3>1.4.4-rc1</h3>
		</center>
		<p class="changelog_entry">- Prepartion to add ultra low quality support. (3GPP codec support)</p>
		<p class="changelog_entry">- Prepartion to add FFMPEG.js to allow browsers to decode unsupported codecs. (and allow merging videos from nPlayer)</p>
		<p class="changelog_entry">- Fixed like and dislike ratios. (A FUCKING SPACE CHARACTER)</p>
		<p class="changelog_entry">- Added privacy mode references.</p>
		<p class="changelog_entry">- Added YouTube embed support, neat userscript is coming next release candidate.</p>
		<p class="changelog_entry">- Refreshed 404 page. (VOLUME WARNING)</p>
		<p class="changelog_entry">- Began development on the YouTube Extractor 2 API.</p>
		<center style="border-top: 1px solid green;">
			<h3>1.4.4-beta</h3>		
		</center>
		<p>The Redesign: Part 2</p>
		<p>Subtitles are now integrated into the video player itself.</p>
		<p>Added a settings page.</p>
		<p>Fast Mode is now fully implemented. (Massive time reduction)</p>
		<p>Features accquired thanks to Fast Mode<sup>2</sup> <br>
			- Reduction in loading times (during testing would max out at 2-8s, slow down caused by signature decryption) <br>
			- No* calls from them. (Some of you would get the joke.) <br>
			<!---* = Reference to the Bogdanoffs, The joke would be displayed if no signatures were detected in the legacy mode. <br>-->
			TODO: Use Promises v2 from nullUtil 2.7 to reduce delay from subtitle extraction
		</p>
		<h4>Full Changelog</h4>
		<p class="changelog_entry">- Fixed age restrictions bypass (also supports FastMode2)</p>
		<p class="changelog_entry">- PerfectSync is now the default sync handler. </p>
		<p class="changelog_entry">- Added LiteSync for more "LIDL" (trash) computers. </p>
		<p class="changelog_entry" style="line-height: 100%;">- Signature decryption no longer requires a JavaScript enviroment. (use --Signatures.useSoftwareJS to enable software decoding) 
		<br> (Offers a major/minor time reduction thanks to the JavaScript JVM depencency being removed)
		</p>
		<p class="changelog_entry">- Moved settings that were previously in the video the page to a dedicated page. (Nice...right?) </p>
		<p class="changelog_entry">- Added theming support. (Rice this bitch) </p>
		<p class="changelog_entry">- Added custom font support. </p>		
		<p class="changelog_entry">- Previous "nPlayer Sync Engine" handlers are now deprecated but still avaliable. </p>
		<p class="changelog_entry">- Fast Mode now supports ALL videos, this basically kills the old method of extracting videos. </p>		
		<p class="changelog_entry">- Removed subtitle option in settings. </p>
		<p class="changelog_entry">- Subtitles are now embed into the browser video player. </p>
		<p class="changelog_entry">- Added references to RSS support. (Subscription support soon.) </p>
		<p class="changelog_entry">- Added references to extended playlist support. </p>
		<p class="changelog_entry">- The nTube backend now supports iWebKit: Secure for communication. </p>
		<p class="changelog_entry">- Added references to nTube Embeds. </p>
		<p class="changelog_entry">- Added references to quality switching. </p>
		<p class="changelog_entry">- Updated to HttpServer 2.1 - Now supports VERY large data transfers via streams. </p>
		<p class="changelog_entry" style="text-decoration: line-through;">- Search now supports channel previews. </p>		
		<center style="border-top: 1px solid green;">
			<h3>1.4.3.3</h3>		
		</center>	
		<p>This is a minor hotfix.</p>
		<h4>Full Changelog</h4>
		<p class="changelog_entry">- Updated AV1 media selection. </p>
		<p class="changelog_entry">- Fixed views and tags extraction. </p>		
		<center style="border-top: 1px solid green;">
			<h3>1.4.3.2</h3>		
		</center>
		<p>This update targeted a major redesign of the nTube UI.</p>
		<p>We also attempted to add PerfectSync, a new nPlayer playback method which works quite well.</p>
		<p>It only sutters now if we loading content due to quality Internet.</p>
		<h4>Full Changelog</h4>
		<p class="changelog_entry">- New UI! Attempting to keep old look while try to add some Web 5.0 elements.</p>
		<p class="changelog_entry">- Added references for themes support. </p>		
		<p class="changelog_entry">- PerfectSync is now an experimental sync option which works quite well.</p>
		<p class="changelog_entry">- Restricted videos now bypass correctly.</p>
		<p class="changelog_entry">- Improved video selection mode, prefers nPlayer if possible.</p>
		<p class="changelog_entry">- Slight improvements to signature decryption.</p>
		<p class="changelog_entry">- nTV has been removed, for now.</p>
		<p class="changelog_entry">- Added references to nMusic, coming soon.</p>
		<p class="changelog_entry">- Subtitles are now overflow safe.</p>
		<p class="changelog_entry">- John Wick no longer asks for your credit card information. </p>
		<p style="color: gray;font-size: xx-small;"><i>Haha, so cool. YASSSS QUEEN SLAY</i></p>
	</div>
</div>
<center>
<p>All entries below are pre beta 1.4.3 circa.</p>
</center>
<div style="border-top: 1px solid green;">
	<h3>1.4.3.2-BETA-old</h3>
	<p class="changelog_entry">- Added new experimental sync mode (PerfectSync), seems to work much better than the other modes.</p>
	<p class="changelog_entry">- Videos no longer are stuck at 360p for some reason, thanks YouTube for switching to seperate streams.</p>
	<p class="changelog_entry" style="text-decoration: line-through;">- Fixed comments always falling back.</p>	
	<p class="changelog_entry">- Fixed issue with '-' in video titles within the channel viewer.</p>
	<p class="changelog_entry">- Updated bypass on restricted videos.</p>	
	<p class="changelog_entry">- New signature detector, slightly expensive time wise but much more effective.</p>
	<h3>1.4.3.1-BETA</h3>
	<p class="changelog_entry">- <s>nTV: Fixed issues regarding CORS. Fixing nTube streaming should follow.</s></p>
	<p class="changelog_entry">- Argument "openCodecsOnly" now supports AV1/AV01 (previously supported WebM only).</p>
	<p class="changelog_entry">- Fixed subtitles within non English locales.</p>
	<p class="changelog_entry">- Add base code for multi-locale subtitle support.</p>
	<p class="changelog_entry">- Reduced YouTube calls to max 1 if no issues occur, reduction in data used.</p>
	<p class="changelog_entry">- New signature decryption method, fixes previous issue with copyrighted content.</p>
	<p class="changelog_entry">- Added AV1/AV01 video encoding support. (force enable it with &av1, else it is automatically done)</p>
	<h3>1.4.3-BETA</h3>
	<p class="changelog_entry">- Upgraded HTTP backend, much faster.</p>
	<p class="changelog_entry">- Added playlist support. (limited to first ~200 videos)</p>
	<p class="changelog_entry">- Updated Search.</p>
	<p class="changelog_entry">- Added nTV, this is experimental.</p>
	<p class="changelog_entry">- Added experimental country restrictions bypass.</p>
	<p class="changelog_entry">- BitChute links are now auto detected.</p>
	<p class="changelog_entry">- BitChute now shows 'trending' videos.</p>
	<p class="changelog_entry">- Added new settings handler. [Base 64 encoded JSON]</p>
	<p class="changelog_entry">- Fixed faulty video URL verification.</p>
	<p class="changelog_entry">- Added subtitles/CC support. (I didn't expect it.)</p>
	<p class="changelog_entry">&nbsp;&nbsp;&nbsp;&nbsp;- Auto generated subtitles are not supported.</p>
	<p class="changelog_entry">&nbsp;&nbsp;&nbsp;&nbsp;- Locked to English for now.</p>
	<p class="changelog_entry">- Reduced time to load a video by a HUGE amount by sneakly scraping pre generated links.</p>
	<p class="changelog_entry">&nbsp;&nbsp;&nbsp;&nbsp;- NOTE: This is only avaliable for Desktop users as <s>video and audio is seperate</s> (Depends on where is the data scraped from).</p>
	<p class="changelog_entry">&nbsp;&nbsp;&nbsp;&nbsp;- NOTE 2: This is only avaliable for a limited amount of videos.</p>
	<h3>1.4.2</h3>
	<p class="changelog_entry">- Possible legacy support added to Internet Explorer users.</p>
	<p class="changelog_entry">- Mobile tweaks added to nTube.</p>
	<p class="changelog_entry">- Added HLS player support (mainly for livestreams), this means that HLS.js is used. A warning to stallman autism users.</p>
	<p class="changelog_entry">&nbsp;&nbsp;&nbsp;&nbsp;- WARNING to Firefox Users: CORB doesn't like Firefox and can fail to load videos, check your JS console.</p>
	<p class="changelog_entry">- Bypassed YouTube anti embed feature.</p>
	<p class="changelog_entry">- BitChute flys in! Added experimental bitchute support. Add &bc to the end of the url to try it out!</p>
	<p class="changelog_entry">- Added experimental comment support.</p>
	<p class="changelog_entry">- Added options to download videos and audio.</p>
	<p class="changelog_entry">- Added an error reason on videos not loading (i.e. Country restrictions).</p>
	<p class="changelog_entry">- Videos show if they are trending currently.</p>
	<h3>1.4.1</h3>
	<p class="changelog_entry">- Added channel viewer.</p>
	<p class="changelog_entry">- Updated 60FPS player to v1.2, perfomance has improved.</p>
	<p class="changelog_entry">- Added audio only mode to playback.</p>
	<p class="changelog_entry">- Added video descriptions and redirect support.</p>
	<p class="changelog_entry">- Added like and dislike count support.</p>
	<p class="changelog_entry">- Added quality controls.</p>
	<p class="changelog_entry">- Switched base 64 decoder to allow for unicode support.</p>
	<h3>1.4</h3>
	<p class="changelog_entry">- Added home page.</p>
	<p class="changelog_entry">- Added trending section.</p>
	<p class="changelog_entry">- Added search section.</p>
	<p class="changelog_entry">- Added 60FPS and 1080p+ video support. (Code Name: 60 FPS Player)</p>
	<h3>1.3</h3>
	<p class="changelog_entry">- Added related videos.</p>
	<h3>1.2</h3>
	<p class="changelog_entry">- Added endscreen support to videos.</p>
	<p class="changelog_entry">- Added channel subscriber count information.</p>
	<h3>1.1</h3>
	<p class="changelog_entry">- Added 'rating' support to videos.</p>
	<p class="changelog_entry">- Added basic playback settings.</p>
	<h3>1.0</h3>
	<p class="changelog_entry">- Inital release.</p>
</div>
<script type="text/javascript" >
var settings = readSettingsToJSON();
if (settings != null && settings.theme) {
	applyTheme(settings.theme);		
}
if (settings != null && settings.font) {
	applyFont(settings.font);		
}
</script>
</body>
</html>
